Unconventional Monetary Policy of the System of the Federal Reserve Bank and its Impact on the Mexican Economy¶

In this project, I estimate a VAR-X Model to analize the effect of the _Forward Guidance_ and _Quantitative Easing_ tools implemented by the Central Bank of the United States of America during the Great Financial Crisis and the Covid-19 pandemic.
In [1]:
from plotly.offline import init_notebook_mode
from urllib.request import urlretrieve
from sie_banxico import SIEBanxico
from INEGIpy import Indicadores
from datetime import date
from fredapi import Fred
import plotly.express as px
import pandas as pd
import quandl
import json
import re

inegi_token = '8220b3b0-e03a-4fed-ab6f-ec0a0646e698'
banxico_token = '624e80478b0e94d290f8266baca2ed4f9b80c18d64bc16385c6acbcf578f8570'
fred_token = '85eb19e3937c054a2fd16b7346062917'
nasdaq_key='US1H1iz4ivZcFERehsve'

init_notebook_mode()

Endogenous Variables: Mexican Economy Indicators¶

Exchange Rate (FIX) and Equilibrium Interbank Interest Rate (TIIE)

In [331]:
banxico_conn = SIEBanxico(token = banxico_token, id_series = ['SF17906', 'SF43773'], language='es')
banxico_json = banxico_conn.get_timeseries()
In [332]:
banxico_df = pd.json_normalize(banxico_json['bmx']['series'], record_path = 'datos', meta = ['idSerie', 'titulo'])
banxico_df['titulo'] = banxico_df['titulo'].apply(lambda x: 'FIX' if re.search('Tipo de cambio', x) else x)
banxico_df['titulo'] = banxico_df['titulo'].apply(lambda x: 'TIIE' if re.search('Tasa', x) else x)
In [333]:
banxico_df['fecha'] = pd.to_datetime(banxico_df['fecha'], format='%d/%m/%Y')
banxico_df['dato'] = pd.to_numeric(banxico_df['dato'])
banxico_df['YM'] = banxico_df['fecha'].apply(lambda x: x.strftime('%Y-%m'))
In [334]:
banxico_df = banxico_df.groupby(['titulo', 'YM']).agg(
    {
        'dato': 'last',
    }
).reset_index()
In [335]:
banxico_df['YM'] = banxico_df['YM'].astype('string') + '-01'
banxico_df['YM'] = pd.to_datetime(banxico_df['YM'])
banxico_df = banxico_df.loc[ ~( (banxico_df['titulo'] == 'FIX') & (banxico_df['dato'] == 0) ), :]
banxico_df = banxico_df[ banxico_df['YM']>'2000-01-01' ]
banxico_df.loc[banxico_df['titulo'] == 'TIIE', 'dato'] = banxico_df.loc[banxico_df['titulo'] == 'TIIE', 'dato']/100
In [345]:
inegi_conn = Indicadores(inegi_token)
inegi_tabla = inegi_conn.obtener_df(
    indicadores=['737219', '910392'],
    nombres=['IGAE', 'INPC'],
    inicio='2000-01-01',
    fin='2024-12-01',
    banco='BIE')
# inegi_tabla.reset_index(inplace=True)
# inegi_tabla['YM'] = pd.to_datetime(inegi_tabla['fechas'])
c:\Users\guaja\Proyectos\Personales\UMP\.venv\Lib\site-packages\INEGIpy\_indicadores.py:108: UserWarning:

Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.

c:\Users\guaja\Proyectos\Personales\UMP\.venv\Lib\site-packages\INEGIpy\_indicadores.py:108: UserWarning:

Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.

In [352]:
mexico_df = inegi_tabla.join(banxico_df.pivot(index='YM', columns=['titulo'], values='dato'), on='fechas')
In [363]:
# mexico_df
mexico_df.reset_index().melt(id_vars='fechas', value_vars=['IGAE', 'INPC', 'FIX', 'TIIE'], var_name='Variable', value_name='Value')
Out[363]:
fechas Variable Value
0 2000-01-01 IGAE 73.629342
1 2000-02-01 IGAE 73.154767
2 2000-03-01 IGAE 73.109386
3 2000-04-01 IGAE 73.245424
4 2000-05-01 IGAE 73.820122
... ... ... ...
1191 2024-07-01 TIIE 0.110800
1192 2024-08-01 TIIE 0.109800
1193 2024-09-01 TIIE 0.106100
1194 2024-10-01 TIIE 0.107300
1195 2024-11-01 TIIE 0.105300

1196 rows × 3 columns

In [366]:
mexico_plot = px.line(mexico_df.reset_index().melt(id_vars='fechas', value_vars=['IGAE', 'INPC', 'FIX', 'TIIE'], var_name='Variable', value_name='Value'),
                      x='fechas', y='Value', color='Variable', facet_col='Variable',
                      labels=dict(Variable='', fechas='', Valor=''),
                      hover_name='Variable', hover_data='Value',
                      facet_col_wrap=2, width=1600, height=800)

mexico_plot.for_each_annotation(lambda a: a.update(text=a.text.replace('=', '')))
mexico_plot.update_layout(showlegend=False)

mexico_plot.update_yaxes(matches=None, showticklabels=True)
mexico_plot.update_yaxes(col=1, row=1, tickformat='.0f', hoverformat='.2f')
mexico_plot.update_yaxes(col=2, row=1, tickformat='.0%', hoverformat='.2%')

mexico_plot.show()

Exogenous Variables: US Indicators¶

Effective and Shadow Federal Funds Rate, Industrial Production (INDPRO) and Volatility Index (VIX)

In [299]:
url = "https://www.atlantafed.org/-/media/documents/datafiles/cqer/research/wu-xia-shadow-federal-funds-rate/WuXiaShadowRate.xlsx"
path, headers = urlretrieve(url, "WuXia_SSR.xlsx")
us_var_tag = 'Variable'
us_var_value = 'Value'
In [300]:
fred = Fred(api_key=fred_token)
indpro = fred.get_series('INDPRO').rename('indpro')
vix = fred.get_series('VIXCLS').rename('vix')
# effr = fred.get_series('DFF')
In [301]:
SSR0 = pd.read_excel(path, sheet_name='Data', names=['Date', 'EFFR', 'SFFR'], usecols=[0,1,2])
SSR0 = SSR0.iloc[SSR0.SFFR.notna().to_list(),:]
us_data = SSR0.join(indpro, on='Date').join(vix, on='Date')
us_data['vix'] = us_data['vix'].ffill()
In [302]:
us_data = us_data.melt(id_vars='Date', value_vars=['EFFR', 'SFFR', 'indpro', 'vix'], var_name=us_var_tag, value_name=us_var_value, ignore_index=False)
rate_vec = us_data[us_var_tag].apply(lambda x: bool( re.search('FFR', x) ) )
us_data.loc[ rate_vec, us_var_value] = us_data.loc[ rate_vec, us_var_value]/100
us_data.loc[us_data[us_var_tag]=='EFFR', us_var_tag] = 'Effective Federal Funds Rate'
us_data.loc[us_data[us_var_tag]=='SFFR', us_var_tag] = 'Shadow Federal Funds Rate'
In [ ]:
us_indicators = px.line(us_data,
                        x='Date', y=us_var_value, color=us_var_tag, facet_col=us_var_tag,
                        labels=dict(Variable='', Date='', Value=''),
                        hover_name='Variable', hover_data='Value',
                        facet_col_wrap=2, width=1600, height=800)
us_indicators.update_traces(hovertemplate='Level: %{y}<extra></extra>')
us_indicators.for_each_annotation(lambda a: a.update(text=a.text.replace('=', '')))

us_indicators.update_layout(showlegend=False)

us_indicators.update_yaxes(matches=None, showticklabels=True)
us_indicators.update_yaxes(col=1, row=2, tickformat='.0%', hoverformat='.2%')
us_indicators.update_yaxes(col=2, row=2, tickformat='.0%', hoverformat='.2%')
us_indicators.update_yaxes(col=1, row=1, tickformat='.0f', hoverformat='.2f')
us_indicators.update_yaxes(col=2, row=1, tickformat='.0f', hoverformat='.2f')

us_indicators.show()
In [ ]:
# jupyter nbconvert Scripts/WuXia.ipynb --to html --output-dir Output/ --no-input